package com.cskaoyan.extend.hidden;

/*

         父类成员变量(field)的隐藏：
             如果，在子类中，定义了和父类同名的成员变量
              a. 在子类类体中，通过同名成员变量的变量名，访问到的是，子类中定义的同名成员变量值
                 看起来，就好像父类成员变量，在子类中，被隐藏起来了
              b. 注意： 在父类方法的方法体中，通过变量名访问同名成员变量的值访问到的是，父类中定义的成员变量值

        1. 在子类中是否可以定义和父类同名的成员变量？ 可以

        2. 如果可以，那么在子类中访问这个同名变量，
           究竟访问到的是父类对象中的值，还是子类对象中的值？ 子类中定义的同名成员变量值
           如果在父类中访问呢？ 父类中定义的同名成员变量值

        3. 是否可以在子类对象中，同时访问到子类对象和父类对象中的同名成员变量的值？
           可以，利用super关键字，可以在子类中，访问到继承自父类的成员变量值

       在父类子类中，如果定义了同名成员变量，记住以下结论：
      1. 如果在方法体中，通过同名成员的变量名，访问父类和子类定义的同名成员变量值
         a. 如果是在父类的方法中，访问同名成员变量，访问到的就是父类的成员变量值
         b. 如果实在子类的方法中，访问同名成员变量，访问到的就是子类成员变量的值

      2. 在子类对象上，对象.的方式来访问成员变量的值，访问到的是子类中定义的同名成员变量值




 */
public class Demo1 {

    public static void main(String[] args) {
        HiddenSon hiddenSon = new HiddenSon();

        // 在子类对象上，调用子类中的方法
        //hiddenSon.sonAccess(); // 200

        // 在子类对象上，调用父类中的方法
        //hiddenSon.fatherAccess(); // 100

        // 在子类对象上，调用子类定义的方法
        //hiddenSon.allAccess();

        // 可以在子类对象.成员变量名
        System.out.println(hiddenSon.value);

    }
}

class HiddenFather {

    int value = 100;

    /*
         在父类定义方法体中，访问同名成员变量
     */
    public void fatherAccess() {
        System.out.println(value);
    }

}

class HiddenSon extends HiddenFather {

    // 可以在子类中定义和父类同名成员变量
    int value = 200;


    /*
         在子类中访问同名成员变量
     */
    public void sonAccess() {
        System.out.println(value);
    }

    /*
         同时访问到父类和子类中定义的同名成员变量值
     */
    public void allAccess() {
        // 直接通过变量名访问，访问到的是子类中同名成员变量的变量值
        System.out.println(value);

        // 利用super访问，子类对象中存储的继承自父类的成员变量值
        System.out.println(super.value);


    }
}
